package br.com.vagacerta.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;

import br.com.vagacerta.modelo.Telefone;
import br.com.vagacerta.modelo.TipoTelefone;

@Repository
public class TelefoneDAO {
	
	private Connection connection;

	@Autowired
	public TelefoneDAO(DataSource dataSource) {
		try {
			this.connection = dataSource.getConnection();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}
	
	public List<TipoTelefone> getListaTipoTelefone() {

		try {
			String sql = "select * from tipo_telefone";

			PreparedStatement stmt = connection.prepareStatement(sql);

			ResultSet rs = stmt.executeQuery();
			List<TipoTelefone> listaTipoTelefone = new ArrayList<TipoTelefone>();

			while (rs.next()) {
				TipoTelefone tipoTelefone = new TipoTelefone();
				tipoTelefone.setCodigoTipoTelefone(rs.getLong("COD_TIPO_TELEFONE"));
				tipoTelefone.setTipoTelefone(rs.getString("TIPO_TELEFONE"));
				listaTipoTelefone.add(tipoTelefone);

			}

			rs.close();
			stmt.close();

			return listaTipoTelefone;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}

	public TipoTelefone retornaTipoTelefoneporId(Long idTipoTelefone) {
		try {

			TipoTelefone tipoTelefone = new TipoTelefone();

			String sql = "SELECT COD_TIPO_TELEFONE, TIPO_TELEFONE FROM TIPO_TELEFONE WHERE COD_TIPO_TELEFONE = ?";
			PreparedStatement stmt;
			stmt = connection.prepareStatement(sql);

			stmt.setLong(1, idTipoTelefone);

			ResultSet rs = stmt.executeQuery();

			while (rs.next()) {
				tipoTelefone.setCodigoTipoTelefone(rs.getLong("COD_TIPO_TELEFONE"));
				tipoTelefone.setTipoTelefone(rs.getString("TIPO_TELEFONE"));
			}

			rs.close();
			stmt.close();

			return tipoTelefone;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}
	
	protected void insereTelefoneCliente(Telefone[] telefones, long codigoCliente) {
		try {

			for (Telefone telefone : telefones) {
				if (telefone != null) {
					String sql = "INSERT INTO TELEFONE (COD_TIPO_TELEFONE, COD_CLIENTE, NUMERO_TELEFONE) VALUES (?, ?, ?)";

					PreparedStatement stmt;
					stmt = connection.prepareStatement(sql);

					stmt.setLong(1, telefone.getTipoTelefone().getCodigoTipoTelefone());
					stmt.setLong(2, codigoCliente);
					stmt.setString(3, telefone.getNumeroTelefone());

					stmt.execute();
					stmt.close();

				}
			}

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}

	}
	
	public void excluiTelefonePorIdCliente(long idCliente) throws SQLException {

		String sql = "DELETE FROM TELEFONE WHERE COD_CLIENTE = ?";

		PreparedStatement stmt;
		stmt = connection.prepareStatement(sql);

		stmt.setLong(1, idCliente);

		stmt.execute();
		stmt.close();

	}

	public List<Telefone> consultaTelefonesPorIdCliente(long idCliente) {
		try {
			String sql = "SELECT * FROM TELEFONE WHERE COD_CLIENTE  = ?";

			PreparedStatement stmt;
			stmt = connection.prepareStatement(sql);

			stmt.setLong(1, idCliente);

			ResultSet rs = stmt.executeQuery();
			List<Telefone> listaTelefone = new ArrayList<Telefone>();


			while (rs.next()) {
				Telefone telefone = new Telefone();
				telefone.setCodigoTelefone(rs.getLong("COD_CLIENTE"));
				telefone.setNumeroTelefone(rs.getString("NUMERO_TELEFONE"));
				telefone.setTipoTelefone(retornaTipoTelefoneporId(rs.getLong("COD_TIPO_TELEFONE")));
				listaTelefone.add(telefone);

			}
			
			rs.close();
			stmt.close();

			return listaTelefone;

		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

}
